/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Manejadores;

import Excepciones.FechaIncorrectaException;
import Excepciones.FechaInferiorException;
import Excepciones.NombreVacioException;
import Excepciones.ReunionSinSeleccionarException;
import Logica.Accion;
import Logica.Reunion;
import Persistencia.ADOAccion;
import Persistencia.ADOProyecto;
import Persistencia.ADOReunion;
import Persistencia.ADOUsuario;
import java.util.Date;
import java.util.Iterator;
import javax.swing.DefaultListModel;

/**
 *
 * @author marco
 */
public class ManejadorCargarAccion {

    private ADOAccion adoAccion;
    private ADOUsuario adoUsr;
    private ADOReunion adoReu;
    private ADOProyecto adoProy;
    public ManejadorCargarAccion() {
        adoAccion = new ADOAccion();
        adoUsr = new ADOUsuario();
        adoReu = new ADOReunion();
        adoProy=new ADOProyecto();
    }

    /* metodo que se encarga de agregar la accion*/
    public boolean agregarAccion(String nombre, String descripcion, String usuario, String fecha, String nombreReunion,String nombreProyecto)
            throws FechaIncorrectaException, FechaInferiorException, ReunionSinSeleccionarException,NombreVacioException, Exception {
        boolean resp = true;
        Accion nuevaAccion = new Accion();
        
        try {
            this.ValidarNombreVacio(nombre);
            this.validaReunionSeleccionada(nombreReunion);
            this.validarLongitudFecha(fecha);//valido la longitud
          //  this.validarDiasMesFecha(fecha);//valido los dias
            //la fecha es semanticamente correcta, se la agrego a la accion para faliciar la validez conta la actual
            nuevaAccion.setFechaVencimiento(fecha);
            this.validarFechaInferior(nuevaAccion.getFechaVencimiento());//valido fecha contra acutal
            nuevaAccion.setNombre(nombre);
            nuevaAccion.setDescripcion(descripcion);
            nuevaAccion.setUsuario(adoUsr.buscarUsuarioPorId(usuario));
            nuevaAccion.setFechaCreacion(this.obtenerFechaActualString());
            adoAccion.insertarAccion(nuevaAccion,nombreReunion,nombreProyecto);
            resp = true;
        } 
        
        catch (Exception e) {
            throw e;

        }
        return resp;
    }
    
    public void ValidarNombreVacio( String nombre) throws NombreVacioException {
    if(nombre.equals(""))
                throw new NombreVacioException();
    }

    /*valida que la fecha de vencimiento no sea menor a la actual*/
    public void validarFechaInferior(java.util.Date fecha) throws FechaInferiorException {
        if (fecha.compareTo(this.obtenerFechaActual()) < 1) {
            throw new FechaInferiorException();
        }

    }

    /* este metodo valida que no se ingresen dias como 32, o meses como 14 etc*/
    public void validarDiasMesFecha(String fecha) throws FechaIncorrectaException {

        String decenaDia = String.valueOf(fecha.charAt(0));
        String unidadDia = String.valueOf(fecha.charAt(1));
        String decenaMes = String.valueOf(fecha.charAt(3));
        String unidadMes = String.valueOf(fecha.charAt(4));
        String[] splitFecha = fecha.split("-"); // tomo el ,es, para ver si es febrero y validar diferente

        if (Integer.valueOf(splitFecha[1]) == 2) {// si el mes es 2 es febrero
            if ((Integer.parseInt(decenaDia) > 2) || (Integer.parseInt(unidadDia) > 8 && Integer.parseInt(decenaDia) <= 2)) {
                throw new FechaIncorrectaException();
            }
        } else {
            if (Integer.parseInt(decenaDia) > 3 || Integer.parseInt(decenaMes) > 1
                    || (Integer.parseInt(decenaDia) == 3 && Integer.parseInt(unidadDia) > 1) || (Integer.parseInt(decenaMes) == 1 && Integer.parseInt(unidadMes) > 2)) {
                throw new FechaIncorrectaException();
            }

        }


    }

    /*verifica la longitud de la fecha para evitar fechas del tipo 12/12/1 
     * etc debe recibir le fecha trimeada
     */
    public void validarLongitudFecha(String fecha) throws FechaIncorrectaException {
       if(!fecha.equals("-  -")){// si la fecha no viene en blanco, hace la validacio, si viene en blanco entra pro defecto
        if (fecha.length() < 10) {
            throw new FechaIncorrectaException();
        }
        this.validarDiasMesFecha(fecha);
       }
    }

    /* obtiene la fecha Actual*/
    public Date obtenerFechaActual() {
        java.util.Date fecha = new Date();
        return fecha;
    }

    /* Pasa la fcha actual a un string de formato dd-MM-yyy*/
    public String obtenerFechaActualString() {
        java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("dd-MM-yyyy");
        String fecha = sdf.format(this.obtenerFechaActual());
        return fecha;
    }

    /* este metodo devuelve el iterator con los datos 
     * para poder cargar el combo de usuarios
     */
    public Iterator CargarUsuarios(String proyecto) {
        Iterator iter = adoUsr.traerUsuariosPorProyectoHabilitados(proyecto).iterator();
        return iter;
    }
    
    /*
     * Este metodo devuelve un iterador con los datos
     * para poder cargar el combo de proyectos
     */
    
    public Iterator CargarProyectos(String usuario){
         Iterator iter = adoProy.traerSoloNombresProyectosParaUsuarioLogueado(usuario).iterator();
        return iter;
        
    }

    public DefaultListModel cargarLista(String proyecto) {
        Iterator iter = adoReu.obtenerReunionesPorProyecto(proyecto).iterator();

        DefaultListModel modeloLista = new DefaultListModel();
        int i = 0;
        while (iter.hasNext()) {
            Reunion reu = (Reunion) iter.next();
            modeloLista.add(i, reu.getNombre());


            i++;
        }

        return modeloLista;
    }

    /* valida el entero de la reunion seleccionada, si es 0 (en realdiad menos uno porque le pas +1) no selecciono nada*/
    public void validaReunionSeleccionada(  String seleccion) throws ReunionSinSeleccionarException {

        if (seleccion.equals("")) {
            throw new ReunionSinSeleccionarException();
        }
    }
}
